package com.songlei.rtcadriondh265demo.utils

import android.annotation.SuppressLint
import android.widget.TextView

/**
 * 网络信息显示管理器
 * 职责：统一格式化并显示网络统计信息
 */
class NetInfoManager(
    private val pushTextView: TextView,
    private val playTextView: TextView
) {
    companion object {
        private const val STATS_PUSH_FORMAT = """
            视频：%s           
            带宽: %s
            延迟: %d ms
            重传率: %.2f%%
            NACK: %d
            分辨率: %dx%d            
            音频：%s
        """
        private const val STATS_PLAY_FORMAT = """
            视频：%s          
            带宽: %s
            延迟: %d ms
            抖动：%d ms
            累计丢包: %d
            丢包率：%.2f%%
            视频丢包: %.2f%%
            音频丢包: %.2f%%
            分辨率: %dx%d
            音频：%s
        """
    }

    // 智能单位转换函数
    private fun formatBandwidth(bps: Long): String {
        require(bps >= 0) { "带宽值不能为负数" }

        return when {
            bps < 1_000 -> "$bps bps"
            bps < 1_000_000 -> "%.1f Kbps".format(bps / 1e3) // 千比特每秒‌:ml-citation{ref="2,4" data="citationList"}
            bps < 1_000_000_000 -> "%.2f Mbps".format(bps / 1e6)
            else -> "%.3f Gbps".format(bps / 1e9)
        }.replace(Regex("(\\.\\d+?)0+ "), "$1 ") // 清理多余零‌:ml-citation{ref="5" data="citationList"}
    }

    /**
     * 更新推流统计信息
     */
    @SuppressLint("DefaultLocale")
    fun updatePushStats(stats: WebRTCStats) {
        pushTextView.text = String.format(
            STATS_PUSH_FORMAT,
            stats.videoMimeType,
            formatBandwidth(stats.bandwidth),
            stats.rtt,
            stats.retransmitRatio,
            stats.nackCount,
            stats.width,
            stats.height,
            stats.audioMimeType,
        )
    }
    fun clearPushStats(){
        pushTextView.text = "已停止"
    }
    fun clearPlayStats(){
        playTextView.text = "已停止"
    }

    /**
     * 更新拉流统计信息
     */
    @SuppressLint("DefaultLocale")
    fun updatePlayStats(stats: WebRTCStats) {
        playTextView.text = String.format(
            STATS_PLAY_FORMAT,
            stats.videoMimeType,
            formatBandwidth(stats.bandwidth),
            stats.rtt,
            stats.jitter,
            stats.packetLoss,
            stats.packetLossRatio,
            stats.videoPacketLoss,
            stats.audioPacketLoss,
            stats.width,
            stats.height,
            stats.audioMimeType,

        )
    }
}